home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 22 / AACD 22.iso / AACD / Programming / powerd / lib / chunky.lha / chunky / DrawTriangle.d < prev    next >
Encoding:
Text File  |  1980-12-03  |  3.0 KB  |  147 lines

  1. OPT    NOEXE,OPTIMIZE
  2.  
  3. MODULE    'lib/chunky'
  4.  
  5. OBJECT xy
  6.     x/y:F
  7.  
  8. OBJECT chunky
  9.     wi/he:L,
  10.     data:PTR TO UBYTE
  11.  
  12. PROC DrawTriangle(dest:PTR TO chunky,dc:PTR TO xy,c)
  13.     DEFL    y
  14.     DEFF    lx,dlx,rx,drx        // coords on destination chunky
  15.     DEFF    x0,x1,x2,y0,y1,y2,list:PTR TO xy
  16.  
  17.     list:=[dc[0].x,dc[0].y,dc[1].x,dc[1].y,dc[2].x,dc[2].y]:xy
  18.  
  19.     DEF    ch,n
  20.     REPEAT
  21.         ch:=FALSE
  22.         FOR n:=0 TO 1
  23.             IF list[n].y>list[n+1].y
  24.                 list[n].x:=:list[n+1].x
  25.                 list[n].y:=:list[n+1].y
  26.                 ch:=TRUE
  27.             ENDIF
  28.         ENDFOR
  29.     UNTIL ch=FALSE
  30.  
  31.     x0:=list[0].x
  32.     y0:=list[0].y
  33.     x1:=list[1].x
  34.     y1:=list[1].y
  35.     x2:=list[2].x
  36.     y2:=list[2].y
  37.  
  38.     IF y0=y1 AND x0>x1 THEN x0:=:x1
  39.     IF y1=y2 AND x1>x2 THEN x1:=:x2
  40.  
  41.     IF y0<0 AND y1<0 AND y2<0 THEN RETURN
  42.     IF x0<0 AND x1<0 AND x2<0 THEN RETURN
  43.     IF y0>=dest.he AND y1>=dest.he AND y2>=dest.he THEN RETURN
  44.     IF x0>=dest.wi AND x1>=dest.wi AND x2>=dest.wi THEN RETURN
  45.  
  46.     IF y0=y1
  47. // +-------+
  48. //  \     /
  49. //   \   /
  50. //    \ /
  51. //     +
  52.         // initialize coords (and deltas) for destination chunky
  53.  
  54.         lx:=x0                // first point x
  55.         rx:=x1                // second point x
  56.         dlx:=(x2-lx)/(y2-y0)    // left side delta
  57.         drx:=(x2-rx)/(y2-y0)    // right side delta
  58.  
  59.         FOR y:=y0 TO y2
  60.             IF y>=dest.he THEN RETURN
  61.             IF y>=0 THEN HLine(dest,lx,rx,y,c)
  62.             lx+=dlx
  63.             rx+=drx
  64.         ENDFOR
  65.  
  66. //        Triangle1(dest,y0,y2,x0,x1,x2,c)
  67.     ELSEIF y1=y2
  68. //     +
  69. //    / \
  70. //   /   \
  71. //  /     \
  72. // +-------+
  73.         // initialize coords (and deltas) for destination chunky
  74.         lx:=rx:=x0            // first point
  75.         dlx:=(x1-lx)/(y2-y0)    // left side delta
  76.         drx:=(x2-rx)/(y2-y0)    // right side delta
  77.  
  78.         FOR y:=y0 TO y1-1
  79.             IF y>=dest.he THEN RETURN
  80.             IF y>=0 THEN HLine(dest,lx,rx,y,c)
  81.             lx+=dlx
  82.             rx+=drx
  83.         ENDFOR
  84.  
  85.     ELSEIF GetXLine(y0,y2,y1,x0,x2)>x1
  86. //    +            +
  87. //   / \          /|
  88. //  /   \        / |
  89. // +_    \      +  |
  90. //   --__ \      \ |
  91. //       --+      \+
  92.         // central point on the left side
  93.  
  94.         // initialize coords (and deltas) for destination chunky
  95.         lx:=rx:=x0            // first point
  96.         dlx:=(x1-lx)/(y1-y0)    // left side delta
  97.         drx:=(x2-rx)/(y2-y0)    // right side delta
  98.  
  99.         FOR y:=y0 TO y1-1
  100.             IF y>=dest.he THEN RETURN
  101.             IF y>=0 THEN HLine(dest,lx,rx,y,c)
  102.             lx+=dlx
  103.             rx+=drx
  104.         ENDFOR
  105.  
  106.         dlx:=(x2-lx)/(y2-y1)    // new left side delta
  107.         FOR y:=y1 TO y2-1
  108.             IF y>=dest.he THEN RETURN
  109.             IF y>=0 THEN HLine(dest,lx,rx,y,c)
  110.             lx+=dlx
  111.             rx+=drx
  112.         ENDFOR
  113.     ELSE
  114. //     +            +
  115. //    / \          /|
  116. //   /   \        / |
  117. //  /     \      +  |
  118. // / ___---+      \ |
  119. //+--              \+
  120.         // central point on the right side
  121.  
  122.         // initialize coords (and deltas) for destination chunky
  123.         lx:=rx:=x0            // first point
  124.         dlx:=(x2-lx)/(y2-y0)    // left side delta
  125.         drx:=(x1-rx)/(y1-y0)    // right side delta
  126.  
  127.         FOR y:=y0 TO y1-1
  128.             IF y>=dest.he THEN RETURN
  129.             IF y>=0 THEN HLine(dest,lx,rx,y,c)
  130.             lx+=dlx
  131.             rx+=drx
  132.         ENDFOR
  133.  
  134.         drx:=(x2-rx)/(y2-y1)    // new right side delta
  135.  
  136.         FOR y:=y1 TO y2-1
  137.             IF y>=dest.he THEN RETURN
  138.             IF y>=0 THEN HLine(dest,lx,rx,y,c)
  139.             lx+=dlx
  140.             rx+=drx
  141.         ENDFOR
  142.     ENDIF
  143. ENDPROC
  144.  
  145. PROC GetXLine(y1:F,y2:F,y3:F,x1:F,x2:F)(F) IS
  146.     (x1-x2)*(y2-y3)/(y2-y1)+x2
  147.